package si.unimb.src.wifisms.control.threads;

import java.io.IOException;

import org.ksoap2.SoapFault;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;
import si.unimb.src.wifisms.communicator.MobidesktopWS;
import si.unimb.src.wifisms.control.BatchSender;
import si.unimb.src.wifisms.entity.*;
import si.unimb.src.wifisms.util.Utility;

/**
 * 
 * @author Ales
 * 
 * Nit, ki poslje SMS. Po potrebi pocaka da se AuthToken validira.
 *
 */
public class SMSSenderRunnable extends AbstractRunnable implements Runnable {

	// SMS sporocilo, ki ga posiljamo
	private SMSMessage message;
	
	/**
	 * 
	 * Konstruktor za razred. Potrebno je podati BatchSenderja (ki je ta objekt ustvaril)
	 * in SMS sporocilo, ki zelimo da se poslje.
	 * 
	 * @param parent BatchSender, ki je ta objekt ustvaril
	 * @param message SMS sporocilo, ki ga zelimo poslati
	 */
	public SMSSenderRunnable(BatchSender parent, SMSMessage message) {
		
		super(parent);
		this.message = message;
		
	}
	
	/**
	 * 
	 * Implementacija glavne akcije
	 * 
	 */
	@Override
	protected void mainAction() {
		
		message.setStatus(SMSMessage.STATUS_VALIDATING_TOKEN);
		
		// Cakamo dokler se status ni preveril (to se lahko zgodi takoj - token je ze preverjen)
		AuthToken token = message.getAuthToken();
		token.waitForValidation();
		
		// Status je vredu ?
		switch(token.getStatus()) {
		
			case AuthToken.STATUS_INVALID:
				// Koncamo
				message.setFailed("napačno uporabniško ime ali geslo");
				Log.d("HelloWS2", "SMS sender invalid token !");
				return;
				
			case AuthToken.STATUS_UNABLE_TO_CHECK:
				// Koncamo
				message.setFailed("prišlo je do časovne omejitve. Poskusite kasneje.");
				Log.d("HelloWS2", "SMS sender unable to check token !");
				return;
		
		}
		
		// Ce je status vredu, zacnemo posiljati
		message.setStatus(SMSMessage.STATUS_SENDING);
		
		boolean sent;
		final String username = token.username;
		final String password = token.password;
		
		for(byte i = 0; i < Settings.MAX_TRIES; i++) {
			
			// Malo pocakamo pred naslednjo iteracijo (ampak ne prvic)
			if(i > 0) {
			
				try {
				
					Log.d("HelloWS2", "SMS sender sleep");
					Thread.sleep(Settings.WAIT_BETWEEN_TRIES);
					
				} catch (InterruptedException e) { }
			
			}
			
			try {
				
				// Je veljavno?
				Log.d("HelloWS2", "SMS sender is sending... (token status = " + token.getStatus() + ")");
				sent = MobidesktopWS.SendSMS(username, password, message.getRecipients(), message.getMessage());
				
				if(sent) {
					
					message.setStatus(SMSMessage.STATUS_SENT);
					
					// podaljsamo zivljensko dobo tokena
					token.expandLifetime();
					
				} else {
				
					message.setFailed("strežnik je zavrnil sporočilo");
					
				}
				
				// po potrebi shranimo sporocilo v telefon
				if(message.getAccount().getSaveMessages()) {
					
					Utility.saveSmsToOutbox(parent.getContext(), message);
				
				}
				
				// Koncamo
				return;
				
			} catch (SoapFault e) {

				// SoapFault pomeni da je WS vrgel Exception
				message.setFailed("na strežniku je prišlo do izjeme");
				return;
				
			} catch (IOException e) {

				// request timeout
				Log.d("HelloWS2", "SMS sender IOException: " + e.getMessage());
				
			} catch (XmlPullParserException e) {
				
				// XmlPullParserException pomeni da je nekaj narobe z XMLom ki se je zgeneriral
				message.setFailed("napaka pri generiranju podatkov za pošiljanje");
				return;
				
			}
			
		}
		
		// Nismo uspeli poslati
		Log.d("HelloWS2", "SMS sender reached MAX_TRIES, ending");
		message.setFailed("prišlo je do časovne omejitve. Poskusite kasneje.");
		return;
		
	}

}
